home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CICA 1993 April
/
CICA MS Windows - April 1993.iso
/
unzipped
/
programr
/
tp
/
tpwmi2
/
percent.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-08-12
|
8KB
|
292 lines
unit Percent;
interface
uses WinProcs,WinTypes,Frames,Strings,BWCC,WObjects;
const OutWidth=3;
max_Lines=2;
type
PPercentDlg = ^TPercentDlg;
TPercentDlg = object(TDlgWindow)
Blank : array[0..1] of char;
PctColor,TextColor:TColorRef;
PctLow,PctHigh,PctCurrent,PctOld:array[1..max_Lines] of integer;
DisplayPct:boolean;
Lines:integer;
BackBrush:HBrush;
PctR:array[1..max_Lines] of TRect;
CancelBool:boolean;
constructor Init(AParent:PWindowsObject; AName:PChar; NumLines:integer; DrawTxt:boolean);
destructor Done; virtual;
procedure SetupWindow; virtual;
function GetClassName:PChar; virtual;
procedure GetWindowClass(var AWndClass:TWndClass); virtual;
procedure SetDefaults; virtual;
procedure SetPctLevel(PctLevel:integer; Line:integer); virtual;
procedure AddPctLevel(PctLevel:integer; Line:integer); virtual;
procedure DelPctLevel(PctLevel:integer; Line:integer); virtual;
procedure DrawPct; virtual;
procedure DrawPercent(Line:integer); virtual;
procedure DrawPctText(Line:integer); virtual;
procedure SetText(Text:PChar;Line:integer); virtual;
procedure WMPaint(var Msg:TMessage); virtual $0088;
procedure Cancel(var Msg:TMessage); virtual id_First+id_Cancel;
procedure Update; virtual;
end;
implementation
constructor TPercentDlg.Init(AParent:PWindowsObject; AName:PChar; NumLines:integer; DrawTxt:boolean);
begin
TDlgWindow.Init(AParent,AName);
CancelBool := false;
Lines := NumLines;
if Lines > max_Lines then Lines := max_Lines;
EnableKBHandler;
DisplayPct := DrawTxt;
StrCopy(Blank,' ');
end;
destructor TPercentDlg.Done;
begin
DeleteObject(BackBrush);
TDlgWindow.Done;
end;
procedure TPercentDlg.SetupWindow;
begin
TDlgWindow.SetupWindow;
SetDefaults;
SendMessage(HWindow,wm_SetText,0,longint(@Blank));
DrawPct;
end;
function TPercentDlg.GetClassName:PChar;
begin
GetClassName := 'Percent_Dialog';
end;
procedure TPercentDlg.GetWindowClass(var AWndClass:TWndClass);
begin
TDlgWindow.GetWindowClass(AWndClass);
AWndClass.lpfnWndProc := Addr(BWCCDefWindowProc);
end;
procedure TPercentDlg.SetDefaults;
var DC:HDC;
Point:TPoint;
DlgR:TRect;
count:integer;
begin
for count := 1 to Lines do
begin
PctLow[count]:=0;
PctHigh[count]:=100;
PctCurrent[count]:=PctLow[count];
PctOld[count]:=-1;
end;
GetClientRect(HWindow,DlgR);
Point.X := DlgR.left; Point.Y := DlgR.top;
ClientToScreen(HWindow,Point);
DlgR.left := Point.X; DlgR.top := Point.Y;
Point.X := DlgR.right; Point.Y := DlgR.bottom;
ClientToScreen(HWindow,Point);
DlgR.right := Point.X; DlgR.bottom := Point.Y;
for count := 1 to Lines do
begin
GetWindowRect(GetDlgItem(HWindow,200+count),PctR[count]);
with PctR[count] do
begin
top := top - DlgR.top;
bottom := bottom - DlgR.top;
left := left - DlgR.left;
right := right - DlgR.left;
end;
end;
PctColor:=RGB(64,64,64);
TextColor:=RGB(0,0,128);
end;
procedure TPercentDlg.SetPctLevel(PctLevel:integer;Line:integer);
begin
PctCurrent[Line]:=PctLevel;
if PctLevel>PctHigh[Line] then PctCurrent[Line]:=PctHigh[Line];
if PctLevel<PctLow[Line] then PctCurrent[Line]:=PctLow[Line];
Update;
DrawPct;
end;
procedure TPercentDlg.AddPctLevel(PctLevel:integer;Line:integer);
begin
PctCurrent[Line]:=PctCurrent[Line]+PctLevel;
if PctCurrent[Line]>PctHigh[Line] then PctCurrent[Line]:=PctHigh[Line];
if PctCurrent[Line]<PctLow[Line] then PctCurrent[Line]:=PctLow[Line];
Update;
DrawPct;
end;
procedure TPercentDlg.DelPctLevel(PctLevel:integer;Line:integer);
begin
PctCurrent[Line]:=PctCurrent[Line]-PctLevel;
if PctCurrent[Line]>PctHigh[Line] then PctCurrent[Line]:=PctHigh[Line];
if PctCurrent[Line]<PctLow[Line] then PctCurrent[Line]:=PctLow[Line];
Update;
DrawPct;
end;
procedure TPercentDlg.DrawPct;
var count:integer;
begin
for count := 1 to Lines do
if PctOld[count] <> PctCurrent[count] then
begin
PctOld[count] := PctCurrent[count];
DrawPercent(count);
if DisplayPct and (count = Lines) then
DrawPctText(count);
end;
if PctCurrent[Lines] = PctLow[Lines] then
DrawPercent(Lines);
end;
procedure TPercentDlg.DrawPercent(Line:integer);
var InR,OutR:TRect;
TempR:TRect;
PaintDC:HDC;
TheBrush,OldBrush:HBrush;
ThePen,OldPen:HPen;
BuffS:string;
Buffer:array[0..10] of char;
MemDC:HDC;
TheBits,OldBits:HBitmap;
begin
TempR := PctR[Line];
TempR.right:=TempR.right-TempR.left;
TempR.left:=0;
TempR.bottom:=TempR.bottom-TempR.top;
TempR.top:=0;
InR:=TempR;
OutR:=TempR;
InflateRect(InR,-1,-1);
InflateRect(OutR,-1,-1);
InR.bottom:=InR.bottom+1;
InR.right:=InR.right+1;
OutR.bottom:=OutR.bottom-1;
if (PctCurrent[Line]-PctLow[Line])<>0 then
InR.left:=InR.left+integer(Trunc((InR.right-InR.left) * ((PctCurrent[Line]-PctLow[Line]) / (PctHigh[Line]-PctLow[Line]))) );
OutR.right:=InR.left+1;
PaintDC:=GetDC(HWindow);
MemDC:=CreateCompatibleDC(PaintDC);
TheBits:=CreateCompatibleBitmap(PaintDC,TempR.right,TempR.bottom);
OldBits:=SelectObject(MemDC,TheBits);
TheBrush:=GetStockObject(Null_Brush);
OldBrush:=SelectObject(MemDC,TheBrush);
ThePen:=CreatePen(ps_Solid,1,GetSysColor(color_WindowFrame));
OldPen:=SelectObject(MemDC,ThePen);
Rectangle(MemDC,TempR.left,TempR.top,TempR.right,TempR.bottom);
SelectObject(MemDC,OldBrush);
DeleteObject(TheBrush);
SelectObject(MemDC,OldPen);
DeleteObject(ThePen);
if (PctCurrent[Line]<>PctHigh[Line]) then
begin
TheBrush:=CreateSolidBrush($00C0C0C0);
OldBrush:=SelectObject(MemDC,TheBrush);
ThePen:=GetStockObject(Null_Pen);
OldPen:=SelectObject(MemDC,ThePen);
Rectangle(MemDC,InR.left,InR.top,InR.right,InR.bottom);
InR.right:=InR.right-2; InR.bottom:=InR.bottom-2;
InflateRect(InR,-2,-2);
DrawInFrame(MemDC,InR,true,1);
InflateRect(InR,2,2);
InR.right:=InR.right+2; InR.left:=InR.left+1; InR.bottom:=InR.bottom+2;
SelectObject(MemDC,OldBrush);
DeleteObject(TheBrush);
SelectObject(MemDC,OldPen);
DeleteObject(ThePen);
end;
if PctCurrent[Line]<>PctLow[Line] then
begin
if OutR.right>(TempR.right-2) then OutR.right:=TempR.right-2;
if Lines = Line then
DrawOutFrame(MemDC,OutR,true,OutWidth) else
DrawOutFrame(MemDC,OutR,true,OutWidth-1);
end;
BitBlt(PaintDC,PctR[Line].left,PctR[Line].top,TempR.right,TempR.bottom,MemDC,0,0,srcCopy);
SelectObject(MemDC,OldBits);
DeleteObject(TheBits);
ReleaseDC(GetDlgItem(HWindow,201),PaintDC);
DeleteDC(MemDC);
end;
procedure TPercentDlg.DrawPctText(Line:integer);
var PaintR:TRect;
Buffer:array[0..10] of char;
BuffS:string[10];
Extent:longint;
PaintDC:HDC;
begin
PaintDC := GetDC(HWindow);
SetTextAlign(PaintDC,ta_Top or ta_Left);
SetBkMode(PaintDC,Transparent);
SetTextColor(PaintDC,TextColor);
Str(PctCurrent[Line],BuffS);
BuffS := BuffS + '%';
StrPCopy(Buffer,BuffS);
Extent := GetTextExtent(PaintDC,Buffer,StrLen(Buffer));
TextOut(PaintDC,
PctR[Line].left+((PctR[Line].right-PctR[Line].left-Loword(Extent)) div 2),
PctR[Line].top+((PctR[Line].bottom-PctR[Line].top-Hiword(Extent)) div 2),
Buffer,StrLen(Buffer));
ReleaseDC(HWindow,PaintDC);
end;
procedure TPercentDlg.SetText(Text:PChar;Line:integer);
var Buffer:array[0..100] of char;
begin
if Text <> nil then
StrCopy(Buffer,Text) else
StrCopy(Buffer,Blank);
if Line <> 0 then
SendDlgItemMsg(100+Line,wm_SetText,0,longint(@Buffer)) else
SendMessage(HWindow,wm_SetText,0,longint(@Buffer));
Update;
end;
procedure TPercentDlg.WMPaint(var Msg:TMessage);
var count:integer;
begin
for count := 1 to Lines do
PctOld[count] := -1;
DrawPct;
end;
procedure TPercentDlg.Cancel(var Msg:TMessage);
begin
CancelBool := true;
end;
procedure TPercentDlg.Update;
var Msg:TMsg;
begin
if Parent <> nil then
begin
while PeekMessage(Msg,0,0,0,pm_Remove) do
if not IsDialogMessage(HWindow,Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
end;
End.